﻿using System;
using System.Linq;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;

namespace Fes.Xrm.Methods
{
    public class MetodosFes
    {
        public static IOrganizationService Servicio;

        // Constructor que recibe los parámetros usados para autenticar el Plugin o la Aplicacion Tercera
        public MetodosFes(IOrganizationService serv)
        {
            Servicio = serv;            
        }       
        
        #region # Método utilizado para conocer si el atributo se encuentra en el diccionario de datos
        public static Boolean ExisteAtributo(string name, Entity entity)
        {
            Boolean existe = false;
            foreach (var EntidadRes in entity.Attributes)
            {
                if (EntidadRes.Key == name) { existe = true; }
            }
            return existe;
        }
        #endregion

        #region # Método de Recuperación de Metadatos para Opciones de Lista
        public static string RecuperaOpcionListaTexto(string vEntityLogicalName, string vLogicalNameAtributo, OptionSetValue ValorDeComparacion)
        {
            string sReturn = string.Empty;
            string OptionText = "";
            RetrieveAttributeRequest request = new RetrieveAttributeRequest();
            request.EntityLogicalName = vEntityLogicalName;// "";
            request.LogicalName = vLogicalNameAtributo;
            RetrieveAttributeResponse response = (RetrieveAttributeResponse)Servicio.Execute(request);

            PicklistAttributeMetadata picklist = (PicklistAttributeMetadata)response.AttributeMetadata;

            foreach (OptionMetadata option in picklist.OptionSet.Options)
            {
                if (option.Value == ValorDeComparacion.Value)
                {
                    OptionText = option.Label.UserLocalizedLabel.Label;
                    break;
                }
            }
            return sReturn = OptionText;
        }
        #endregion

        # region # Método de Recuperación de datos en CRM 1 Filtro (Equal)
        public static EntityCollection RecuperacionMultiple(string Entidad, string[] Columnas, string AtributoFiltro1, string ValorFiltro1)
        {
            // Se especifica el nombre de la entidad de dónde se obtendrán los datos (FROM)
            QueryExpression consulta = new QueryExpression(Entidad);

            // Campos a recuperar de la tabla (SELECT)
            consulta.ColumnSet.AddColumns(Columnas);

            // Filtro 1 y 2 como condición en la consulta (WHERE)
            consulta.Criteria = new FilterExpression();
            consulta.Criteria.AddCondition(AtributoFiltro1, ConditionOperator.Equal, ValorFiltro1);


            // Se guarda el resultado en una colección de datos
            EntityCollection Registros = Servicio.RetrieveMultiple(consulta);

            return Registros;

        }

        #endregion

        # region # Método de Recuperación de datos en CRM 2 filtros (AND) (Equal)
        public static EntityCollection RecuperacionMultiple(string Entidad, string[] Columnas, string AtributoFiltro1, string ValorFiltro1, string AtributoFiltro2, string ValorFiltro2)
        {
            // Se especifica el nombre de la entidad de dónde se obtendrán los datos (FROM)
            QueryExpression consulta = new QueryExpression(Entidad);

            // Campos a recuperar de la tabla (SELECT)
            consulta.ColumnSet.AddColumns(Columnas);

            // Filtro 1 y 2 como condición en la consulta (WHERE)
            consulta.Criteria = new FilterExpression();
            consulta.Criteria.AddCondition(AtributoFiltro1, ConditionOperator.Equal, ValorFiltro1);

            FilterExpression filtrohijo = consulta.Criteria.AddFilter(LogicalOperator.And);
            filtrohijo.AddCondition(AtributoFiltro2, ConditionOperator.Equal, ValorFiltro2);

            // Se guarda el resultado en una colección de datos
            EntityCollection Registros = Servicio.RetrieveMultiple(consulta);

            return Registros;

        }
        #endregion

        # region # Método de Recuperación de datos en CRM 3 Filtros (AND) (Equal)
        public static EntityCollection RecuperacionMultiple(string Entidad, string[] Columnas, string AtributoFiltro1, string ValorFiltro1, string AtributoFiltro2, string ValorFiltro2, string AtributoFiltro3, string ValorFiltro3)
        {
            // Se especifica el nombre de la entidad de dónde se obtendrán los datos (FROM)
            QueryExpression consulta = new QueryExpression(Entidad);

            // Campos a recuperar de la tabla (SELECT)
            consulta.ColumnSet.AddColumns(Columnas);

            // Filtro 1 y 2 como condición en la consulta (WHERE)
            consulta.Criteria = new FilterExpression();
            consulta.Criteria.AddCondition(AtributoFiltro1, ConditionOperator.Equal, ValorFiltro1);

            FilterExpression filtrohijo = consulta.Criteria.AddFilter(LogicalOperator.And);
            filtrohijo.AddCondition(AtributoFiltro2, ConditionOperator.Equal, ValorFiltro2);

            FilterExpression filtrosubhijo = consulta.Criteria.AddFilter(LogicalOperator.And);
            filtrohijo.AddCondition(AtributoFiltro3, ConditionOperator.Equal, ValorFiltro3);

            // Se guarda el resultado en una colección de datos
            EntityCollection Registros = Servicio.RetrieveMultiple(consulta);

            return Registros;

        }
        #endregion
    }
}
